{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import cv2\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "import matplotlib.pyplot as plt\n",
    "from tensorflow.keras.models import Model\n",
    "from tensorflow.keras.layers import Input,Lambda\n",
    "from tensorflow.keras.optimizers import Adam, SGD\n",
    "from yolo import yolo_body,yolo_loss,yolo_eval\n",
    "from data_gen import data_generator"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0\"\n",
    "gpus = tf.config.experimental.list_physical_devices('GPU')\n",
    "tf.config.experimental.set_memory_growth(gpus[0], True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "#---------------------------------------------------#\n",
    "#   超参数\n",
    "#---------------------------------------------------#\n",
    "input_shape = (416,416)\n",
    "batch_size = 2\n",
    "classes_path = './model_data/YYMnist_classes.txt'\n",
    "anchors_path = './model_data/yolo_anchors.txt'\n",
    "annotation_path = 'C:/Users/Administrator/tf2/TF-object_detection/zzk_yolo/dataset/yymnist_train.txt'\n",
    "#预测\n",
    "iou_thres = 0.3\n",
    "score_thres = 0.5\n",
    "#---------------------------------------------------#\n",
    "#   获得类和先验框\n",
    "#---------------------------------------------------#\n",
    "def get_classes(classes_path):\n",
    "    '''loads the classes'''\n",
    "    with open(classes_path) as f:\n",
    "        class_names = f.readlines()\n",
    "    class_names = [c.strip() for c in class_names]\n",
    "    return class_names\n",
    "\n",
    "def get_anchors(anchors_path):\n",
    "    '''loads the anchors from a file'''\n",
    "    with open(anchors_path) as f:\n",
    "        anchors = f.readline()\n",
    "    anchors = [float(x) for x in anchors.split(',')]\n",
    "    return np.array(anchors).reshape(-1, 2)\n",
    "class_names = get_classes(classes_path)\n",
    "anchors = get_anchors(anchors_path)\n",
    "num_classes = len(class_names)\n",
    "num_anchors = len(anchors)\n",
    "#---------------------------------------------------#\n",
    "#   打开txt\n",
    "#---------------------------------------------------#\n",
    "with open(annotation_path) as f:\n",
    "    lines = f.readlines()\n",
    "#---------------------------------------------------#\n",
    "#   画图\n",
    "#---------------------------------------------------#\n",
    "def show_single_image(img_arr):\n",
    "    fig = plt.figure(figsize = (8,8))\n",
    "    plt.imshow(img_arr)\n",
    "    plt.axis('on')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#---------------------------------------------------#\n",
    "#   模型\n",
    "#---------------------------------------------------#\n",
    "image_input = Input(shape=(None, None, 3))\n",
    "model_body = yolo_body(image_input,num_anchors//3, num_classes)\n",
    "\n",
    "h, w = input_shape\n",
    "y_true = [Input(shape=(h//{0:32, 1:16, 2:8}[l], w//{0:32, 1:16, 2:8}[l], num_anchors//3, num_classes+5)) for l in range(3)]\n",
    "loss_input = [*model_body.output, *y_true]\n",
    "model_loss = Lambda(yolo_loss, output_shape=(1,), name='yolo_loss',\n",
    "    arguments={'anchors': anchors, 'num_classes': num_classes, 'ignore_thresh': 0.5})(loss_input)\n",
    "\n",
    "model = Model([model_body.input, *y_true], model_loss)\n",
    "model.compile(optimizer=Adam(lr=1e-3), loss={'yolo_loss': lambda y_true, y_pred: y_pred})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/5\n",
      "500/500 [==============================] - 131s 262ms/step - loss: 238.0467 - lr: 0.0010\n",
      "Epoch 2/5\n",
      "500/500 [==============================] - 131s 262ms/step - loss: 60.9709 - lr: 3.6788e-04\n",
      "Epoch 3/5\n",
      "500/500 [==============================] - 132s 263ms/step - loss: 54.6943 - lr: 1.3534e-04\n",
      "Epoch 4/5\n",
      "500/500 [==============================] - 132s 263ms/step - loss: 51.3900 - lr: 4.9787e-05\n",
      "Epoch 5/5\n",
      "500/500 [==============================] - 132s 263ms/step - loss: 50.5940 - lr: 1.8316e-05\n"
     ]
    }
   ],
   "source": [
    "#---------------------------------------------------#\n",
    "#   训练\n",
    "#---------------------------------------------------#\n",
    "def scheduler(epoch):\n",
    "    return 0.001 * tf.math.exp(0.1 * (- epoch*10))\n",
    "reduce_lr = tf.keras.callbacks.LearningRateScheduler(scheduler)\n",
    "history = model.fit(data_generator(lines, batch_size, input_shape, anchors, num_classes),\n",
    "                steps_per_epoch=max(1, len(lines)//batch_size),epochs=5,callbacks=[reduce_lr])\n",
    "model.save(\"yolo3.h5\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "18\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#---------------------------------------------------#\n",
    "#   预测\n",
    "#---------------------------------------------------#\n",
    "img = plt.imread(\"test.jpg\")\n",
    "img_size = img.shape[:2]\n",
    "img = tf.expand_dims(img,axis = 0)\n",
    "img = tf.cast(img,dtype = tf.float32)\n",
    "img /= 255.\n",
    "# model = yolo_body(image_input,num_anchors//3, num_classes)\n",
    "# model.load_weights(\"yolo3.h5\")\n",
    "\n",
    "yolo_out = model(img) #yolo_out = (1, 13, 13, 3*(4+1+num_class)) (1, 26, 26, 45) (1, 52, 52, 45)\n",
    "boxes, scores, classes = yolo_eval(yolo_out, anchors,num_classes, img_size,score_threshold=0.15, iou_threshold=iou_thres)\n",
    "#                                    score_threshold=score_thres, iou_threshold=iou_thres)\n",
    "boxes = tf.cast(boxes,dtype = tf.int32)\n",
    "print(len(classes))\n",
    "img = plt.imread(\"test.jpg\")\n",
    "for i in range(len(classes)):\n",
    "    y1,x1,y2,x2 = boxes[i]\n",
    "    cv2.rectangle(img, (x1,y1), (x2,y2), (255,0,0), 1)\n",
    "    text = str(int(classes[i]))\n",
    "    cv2.putText(img, text, (x2,y2), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)\n",
    "show_single_image(img)    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "# inp = data_generator(lines, batch_size, input_shape, anchors, num_classes)\n",
    "# a = next(inp)\n",
    "# model.summary()\n",
    "# res = model.get_layer('conv4_block6_2_relu').output"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
